﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Microsoft.Practices.ObjectBuilder;
using GC2.Entities.Seguridad;
using GC2.Entities.Admin;
using GC2.Bussines.BMAdmin;

public partial class Clientes_Cobranza: GenericPage
{
    #region Propiedades
    Usuarios usuario = new Usuarios();
    private string scriptSession
    {
        get
        {
            return (string)Session["scriptSession"];
        }
        set
        {
            Session["scriptSession"] = value;
        }
    }
    List<Cheques> listaCheques = new List<Cheques>();
    List<Cheques> listaChequesCambio = new List<Cheques>();
    GC2.Funciones.General.FunctionsSite f = new GC2.Funciones.General.FunctionsSite();

    private Param param = new Param();

    #endregion

    #region Controles

    #region Page_Load
    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            SetearCultura();
            SetearConexion();
            if (!this.IsPostBack)
            {
                usuario = (Usuarios)Session["UsuarioActual"];
                lblAccion.Text = "";
                btnOtro.Visible = false;             
                Clientes cliente = new Clientes();
                List<Clientes> listaClientes = new List<Clientes>();
                BMClientes bmClientes = new BMClientes(Connection);
                listaClientes = bmClientes.BMClientesSearch(cliente);
                Session["listaClientes"] = listaClientes;
                lblAccion.Text = "Datos de la Operación de Venta";
                trFac1.Visible = false;
                trFac2.Visible = false;
                trFac3.Visible = false;
                trCheques2.Visible = false;
                if (Session["Cobranza"] != null)
                {
                    CargarDatos();
                    Session["Cobranza"] = null;
                }
            }
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region txtIdCliente_TextChanged
    protected void txtIdCliente_TextChanged(object sender, EventArgs e)
    {
        try
        {
            txtSaldo.Text = "";
            BuscarCliente();
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region btnBuscarCliente_Click
    protected void btnBuscarCliente_Click(object sender, EventArgs e)
    {
        try
        {
            txtIdCliente.Text = "";
            txtCliente.Text = "";
            txtSaldo.Text = "";
            BuscarCliente();
        }
        catch (Exception ex) { throw ex; }
    }
    #endregion

    #region btnGuardar_Click
    protected void btnGuardar_Click(object sender, EventArgs e)
    {
        try
        {
            if (txtMonto.Text != "")
            {
                Decimal dMonto = Convert.ToDecimal(txtMonto.Text.Trim());
                Decimal dSaldo = Convert.ToDecimal(txtSaldo.Text.Trim());
                if (dMonto > dSaldo)
                {
                    lblMensaje.Text = "Monto mayor que el Saldo del Cliente.";
                    mpeMensaje.Show();
                    return;
                }
                if (chkImputa.Checked)
                {
                    Decimal dSaldoFac = Convert.ToDecimal(txtSaldoFac.Text.Trim());
                    if (dMonto > dSaldoFac)
                    {
                        lblMensaje.Text = "Monto mayor que el Saldo de la Operación.";
                        mpeMensaje.Show();
                        return;
                    }
                }
                Guardar();
            }
            else
            {
                // monto incorrecto
                lblMensaje.Text = "Monto Incorrrecto.";
                mpeMensaje.Show();
            }
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region btnOtro_Click
    protected void btnOtro_Click(object sender, EventArgs e)
    {
        try
        {
            Limpiar();
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region btnCancelar_Click
    protected void btnCancelar_Click(object sender, EventArgs e)
    {
        try
        {
            Session["Venta"] = null;
            Response.Redirect("~/Seguridad/Default.aspx", false);
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region chkImputa_CheckedChanged
    protected void chkImputa_CheckedChanged(object sender, EventArgs e)
    {
        try
        {
            if (chkImputa.Checked)
            {
                trFac1.Visible = true;
                trFac2.Visible = true;
                trFac3.Visible = true;
            }
            else
            {
                trFac1.Visible = false;
                trFac2.Visible = false;
                trFac3.Visible = false;
            }
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region btnAgregarCheque_Click
    protected void btnAgregarCheque_Click(object sender, EventArgs e)
    {
        try
        {
            if (txtBanco.Text == "")
            {
                lblMensaje.Text = "Falta Nombre del Banco.";
                mpeMensaje.Show();
                return;
            }

            if (f.isNumeric(txtCodBanco.Text))
            {
                if (f.isNumeric(txtMontoCheque.Text))
                {
                    Decimal dMonto = Convert.ToDecimal(txtMontoCheque.Text);
                    if (dMonto > 0)
                    {
                        CambiarCheque();
                    }
                    else
                    {
                        lblMensaje.Text = "Debe informar Monto del Cheque.";
                        mpeMensaje.Show();
                    }
                }
                else
                {
                    lblMensaje.Text = "Monto del Cheque Incorrecto.";
                    mpeMensaje.Show();
                }
            }
            else
            {
                lblMensaje.Text = "El Código de Banco es un número de hasta 3 cifras ej: 20.";
                mpeMensaje.Show();
            }
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region gvCheques_SelectedIndexChanged
    protected void gvCheques_SelectedIndexChanged(object sender, EventArgs e)
    {
        try
        {
            trCheques2.Visible = true;
            listaCheques = (List<Cheques>)Session["listaCheques"];
            Cheques cheque = new Cheques();
            cheque.Item = int.Parse(gvCheques.SelectedDataKey.Value.ToString());
            List<Cheques> listaTemp = listaCheques;
            listaCheques = new List<Cheques>();
            foreach (Cheques item in listaTemp)
            {
                if (item.Item == cheque.Item)
                {
                    ActulizaCboEstado(item.IdEstado);
                    txtCodBanco.Text = item.CodBanco.ToString();
                    txtBanco.Text = item.Banco;
                    FechaCh.SetFecha(item.FechaCh);
                    txtNumero.Text = item.Numero;
                    txtMontoCheque.Text = item.Monto.ToString();
                    txtItem.Text = item.Item.ToString();
                }
            }
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region gvCheques_PageIndexChanging
    protected void gvCheques_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        try
        {
            gvCheques.PageIndex = e.NewPageIndex;
            gridDataBaundCheques();
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region gvCheques_RowDataBound
    protected void gvCheques_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        try
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                listaCheques = (List<Cheques>)Session["listaCheques"];
                if (listaCheques[e.Row.RowIndex].IdEstado == 2 || listaCheques[e.Row.RowIndex].IdEstado == 4)
                {
                    e.Row.Cells[7].Enabled = false;
                }
            }
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #endregion

    #region Métodos

    #region gridDataBaundCheques
    protected void gridDataBaundCheques()
    {
        try
        {
            listaCheques = (List<Cheques>)Session["listaCheques"];
            gvCheques.DataSource = listaCheques;
            gvCheques.DataBind();
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region BuscarCliente
    public void BuscarCliente()
    {
        try
        {
            List<Clientes> listaClientes = new List<Clientes>();
            listaClientes = (List<Clientes>)Session["listaClientes"];
            Clientes proveedor = new Clientes();
            if (txtIdCliente.Text.Trim() != "")
            {
                proveedor.Id_Cliente = Convert.ToInt16(txtIdCliente.Text.Trim());
            }
            proveedor.Nombre = txtCliente.Text.Trim();

            bool encontrado = false;
            foreach (Clientes item in listaClientes)
            {
                if (item.Id_Cliente == proveedor.Id_Cliente)
                {
                    txtIdCliente.Text = item.Id_Cliente.ToString();
                    txtCliente.Text = item.Nombre;
                    txtSaldo.Text = item.Saldo.ToString();
                    encontrado = true;
                    break;
                }
                if (item.Nombre == proveedor.Nombre)
                {
                    txtIdCliente.Text = item.Id_Cliente.ToString();
                    txtCliente.Text = item.Nombre;
                    txtSaldo.Text = item.Saldo.ToString();
                    encontrado = true;
                    break;
                }
            }

            if (!encontrado)
            {
                txtIdCliente.Text = "";
                txtCliente.Text = "";
                #region dispararPopUp(hacePostBack)

                string scriptSession = @"
            <script language=""javascript"" type=""text/javascript"">
            <!--
                function mostrarCliente()
                {
                    var stringURL = '../Admin/BuscarCliente.aspx?pStation=0';
                    var oINPUTS = document.getElementsByTagName (""INPUT"");
                    for(var a=0;a<oINPUTS.length; a++)
                    {
                        //Validaciones para cuando el control fue arrastrado a un PopUP (Sin MasterPage)

                        if(oINPUTS[a].getAttribute(""id"") == 'ct100_DefaultContent_txtIdConcepto')
                        {
                            alert('U1a: &IdConcepto = ' + oINPUTS[a].getAttribute(""value""));
                            stringURL = stringURL + '&Id_Concepto=' + oINPUTS[a].getAttribute(""value"");
                        }
                        if(oINPUTS[a].getAttribute(""id"") == 'ct100_DefaultContent_txtConcepto')
                        {  
                            //alert('U2a: &Concepto = ' + oINPUTS[a].getAttribute(""value""));
                            stringURL = stringURL + '&Concepto=' + oINPUTS[a].getAttribute(""value"");
                        }
                        if(oINPUTS[a].getAttribute(""id"") == 'ct100_DefaultContent_txtSaldo')
                        {  
                            alert('U3a: &Saldo = ' + oINPUTS[a].getAttribute(""value""));
                            stringURL = stringURL + '&Saldo=' + oINPUTS[a].getAttribute(""value"");
                        }
                    }
                    // alert(stringURL);
                    var newWin = window.open(stringURL, ""popup"", ""menubar=no, resizable=no, scrollbars=yes, height=450, width=550, left=100, top=100"");
                }
                mostrarCliente();
            //-->
            </script>
            ";

                Page.ClientScript.RegisterStartupScript(this.GetType(), "ScriptA", scriptSession);
                #endregion
            }

        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region Guardar
    protected void Guardar()
    {
        try
        {
            Clientes cliente = new Clientes();
            List<Clientes> listaClientes = new List<Clientes>();
            BMClientes bmClientes = new BMClientes(Connection);
            listaClientes = (List<Clientes>)Session["listaClientes"];
            cliente.Id_Cliente = Convert.ToInt16(txtIdCliente.Text.Trim());

            lblAccion.Text = "NO se pudo actualizar Saldo";

            for (int i = 0; i < listaClientes.Count; i++)
            {
                if (listaClientes[i].Id_Cliente == cliente.Id_Cliente)
                {
                    // actualizar cliente
                    cliente = listaClientes[i];
                    Decimal dMonto = Convert.ToDecimal(txtMonto.Text.Trim());
                    Decimal dSaldo = cliente.Saldo - dMonto;
                    cliente.Saldo = dSaldo;
                    bmClientes.BMClientesUpdate(cliente);
                    decimal decSaldo = Convert.ToDecimal(dSaldo);
                    decimal decTemp = Math.Round(decSaldo, 2);
                    txtSaldo.Text = decTemp.ToString();

                    // grabar ingreso de caja
                    BMIngresos bmIngresos = new BMIngresos(Connection);
                    Ingresos ingreso = bmIngresos.BMIngresosGetNext();
                    ingreso.Concepto = "Cobranza";
                    ingreso.Fecha = System.DateTime.Now;
                    //CargaParam(); // GenericPage
                    //param = (Param)Session["Param"];
                    Cajas oCaja = new Cajas();
                    oCaja = (Cajas)Session["Caja"];
                    if (oCaja == null)
                    {
                        oCaja = CajaAbierta();
                    }
                    ingreso.Id_Caja = oCaja.Id_Caja;
                    ingreso.Id_Cliente = cliente.Id_Cliente;
                    ingreso.Id_Concepto = 0;
                    ingreso.Id_Usuario = UsuarioActual().Id_Usuario;
                    ingreso.Monto = dMonto;
                    ingreso.Observaciones = txtObservaciones.Text.Trim();
                    bmIngresos.BMIngresosInsert(ingreso);

                    if (chkImputa.Checked)
                    {
                        SaldoFactura();
                        GrabarCobranza(ingreso);
                    }
                    else
                    {
                        btnOtro.Visible = true;
                    }

                    btnGuardar.Visible = false;
                    
                    lblAccion.Text = "Saldo Actualizado";
                    Session["listaClientes"] = listaClientes;
                    break;
                }
            }      
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region Limpiar
    protected void Limpiar()
    {
        try
        {
            txtIdCliente.Text = "";
            txtCliente.Text = "";
            txtSaldo.Text = "";
            txtMonto.Text = "";
            txtObservaciones.Text = "";
            lblAccion.Text = "Seleccionar Cliente";
            btnOtro.Visible = false;
            btnGuardar.Visible = true;
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region CargarDatos
    protected void CargarDatos()
    {
        try
        {
            trFac1.Visible = true;
            trFac2.Visible = true;
            trFac3.Visible = true;
            btnBuscarCliente.Enabled = false;
            Ventas venta = (Ventas)Session["Venta"];
            txtIdCliente.Text = venta.Id_Cliente.ToString();
            txtCliente.Text = venta.Cliente;
            BMClientes bmClientes = new BMClientes(Connection);
            Clientes cliente = new Clientes();
            cliente.Id_Cliente = venta.Id_Cliente;
            cliente = bmClientes.BMClientesGetOne(cliente);
            txtSaldo.Text = cliente.Saldo.ToString();
            txtSaldoFac.Text = venta.CtaCte.ToString().Trim();
            chkImputa.Text = venta.Id_Ventas.ToString();
            DateTime dtHoy = DateTime.Now.Date;
            string sFecha = dtHoy.ToString().Remove(11);
            Fecha1.SetFecha(Convert.ToDateTime(sFecha));
            venta.FFactura = venta.Prefijo.Trim();
            venta.FFactura += venta.Factura.ToString().Trim();
            txtFactura.Text = venta.FFactura;

            // Mostrar Cheques
            listaCheques = new List<Cheques>();
            BMCheques bmCheques = new BMCheques(Connection);
            Cheques cheque = new Cheques();
            cheque.Id_Ventas = venta.Id_Ventas;
            listaCheques = bmCheques.BMChequesGetAllByVenta(cheque);
            Session["listaCheques"] = listaCheques;
            Session["listaChequesCambio"] = listaChequesCambio;


            // ActualizarTotalCheques();
            trCheques2.Visible = false;
            ActualizarGrillaCheques();
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region ActualizarGrillaCheques
    protected void ActualizarGrillaCheques()
    {
        try
        {
            gridDataBaundCheques();
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region ActulizaCboEstado
    protected void ActulizaCboEstado(int idEstado)
    {
     try
     {
         ListItem item1 = new ListItem();
         item1.Value = "1";
         item1.Text = "Pendiente";

         ListItem item2 = new ListItem();
         item2.Value = "2";
         item2.Text = "Cobrado";

         ListItem item3 = new ListItem();
         item3.Value = "3";
         item3.Text = "Devuelto";

         ListItem item4 = new ListItem();
         item4.Value = "4";
         item4.Text = "Cancelado";

         switch (idEstado)
         {
             case 1:
                 cboEstado.Items.Clear();
                 cboEstado.Items.Add(item2);
                 cboEstado.Items.Add(item3);
                 cboEstado.SelectedIndex = 0;
                 break;

             case 3:
                 cboEstado.Items.Clear();
                 cboEstado.Items.Add(item1);
                 cboEstado.Items.Add(item4);
                 cboEstado.SelectedIndex = 0;
                 break;

             default:
                 break;  
         }
     }
     catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region CambiarCheque
    protected void CambiarCheque()
    {
        try
        {
            listaCheques = (List<Cheques>)Session["listaCheques"];
            int iItem = Convert.ToInt16(txtItem.Text);
            Usuarios usuario = UsuarioActual();
            foreach (Cheques cheque in listaCheques)
            {
                if (cheque.Item == iItem)
                {
                    cheque.CodBanco = Convert.ToInt16(txtCodBanco.Text.Trim());
                    cheque.Banco = txtBanco.Text.Trim();
                    cheque.FechaCh = FechaCh.GetFecha();
                    cheque.Numero = txtNumero.Text;
                    cheque.Monto = Convert.ToDecimal(txtMontoCheque.Text.Trim());
                    cheque.IdEstado = Convert.ToInt16(cboEstado.SelectedItem.Value);
                    cheque.Estado = cboEstado.SelectedItem.Text;
                    cheque.FechaEstado = DateTime.Now;
                    cheque.Id_Usuario = usuario.Id_Usuario;
                    switch (cheque.IdEstado)
                    {
                        case 1: // Pendiente
                            break;
                        case 2: // Cobrado
                            Decimal dMonto = Convert.ToDecimal(txtMonto.Text);
                            dMonto += cheque.Monto;
                            txtMonto.Text = dMonto.ToString();
                            txtMonto.Attributes.Add("readonly", "readonly");
                            break;
                        case 3: // Devuelto
                            break;
                        case 4: // Cancelado
                            Decimal dCMonto = Convert.ToDecimal(txtMonto.Text);
                            dCMonto += cheque.Monto;
                            txtMonto.Text = dCMonto.ToString();
                            txtMonto.Attributes.Add("readonly", "readonly");
                            break;
                        default:
                            break;
                    }
                    break;
                }
            }
            Session["listaCheques"] = listaCheques;
            listaChequesCambio = (List<Cheques>)Session["listaChequesCambio"];
            bool bExiste = false; 
            foreach (Cheques cheque in listaChequesCambio)
            {
                if (cheque.Item == iItem)
                {
                    cheque.CodBanco = Convert.ToInt16(txtCodBanco.Text.Trim());
                    cheque.Banco = txtBanco.Text.Trim();
                    cheque.FechaCh = FechaCh.GetFecha();
                    cheque.Numero = txtNumero.Text;
                    cheque.Monto = Convert.ToDecimal(txtMontoCheque.Text.Trim());
                    cheque.IdEstado = Convert.ToInt16(cboEstado.SelectedItem.Value);
                    cheque.Estado = cboEstado.SelectedItem.Text;
                    cheque.FechaEstado = DateTime.Now;
                    cheque.Id_Usuario = usuario.Id_Usuario;
                    bExiste = true;
                    break;
                }
            }
            if (!bExiste)
            {
                Cheques cheque = new Cheques();
                cheque.Id_Ventas = listaCheques[0].Id_Ventas;
                cheque.Item = iItem;
                cheque.CodBanco = Convert.ToInt16(txtCodBanco.Text.Trim());
                cheque.Banco = txtBanco.Text.Trim();
                cheque.FechaCh = FechaCh.GetFecha();
                cheque.Numero = txtNumero.Text;
                cheque.Monto = Convert.ToDecimal(txtMontoCheque.Text.Trim());
                cheque.IdEstado = Convert.ToInt16(cboEstado.SelectedItem.Value);
                cheque.Estado = cboEstado.SelectedItem.Text;
                cheque.FechaEstado = DateTime.Now;
                cheque.Id_Usuario = usuario.Id_Usuario;
                listaChequesCambio.Add(cheque);
            }
            Session["listaChequesCambio"] = listaChequesCambio;
            LimpiarCheque();
            trCheques2.Visible = false;
            ActualizarGrillaCheques();
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region SaldoFactura
    protected void SaldoFactura()
    {
        try
        {
            Decimal dMonto = Convert.ToDecimal(txtMonto.Text.Trim());
            Ventas venta = (Ventas)Session["Venta"];
            venta.Pago += dMonto;
            venta.CtaCte -= dMonto;
            BMVentas bmVentas = new BMVentas(Connection);
            bmVentas.BMVentasUpdateCtaCte(venta);
            txtSaldoFac.Text = venta.CtaCte.ToString();
            btnOtro.Visible = false;
            txtMonto.Enabled = false;
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region GrabarCobranza
    protected void GrabarCobranza(Ingresos ingreso)
    {
        try
        {
            Ventas venta = (Ventas)Session["Venta"];
            Cobranzas cobranza = new Cobranzas();
            BMCobranzas bmCobranzas = new BMCobranzas(Connection);
            cobranza.Sucursal = 1;
            cobranza.Id_Ingreso = ingreso.Id_Ingreso;
            cobranza.Id_Ventas = venta.Id_Ventas;
            cobranza.Id_Caja = ingreso.Id_Caja;
            cobranza.Prefijo = venta.Prefijo;
            cobranza.Factura = venta.Factura;
            cobranza.PFMes = venta.PFMes;
            cobranza.PFAnio = venta.PFAnio;
            cobranza.Id_Cliente = venta.Id_Cliente;
            cobranza.Cliente = venta.Cliente;
            cobranza.FechaCaja = ingreso.Fecha;
            cobranza.FechaCob = Fecha1.GetFecha();
            cobranza.FechaFac = venta.Fecha;
            cobranza.Id_Estado = 1;
            cobranza.Estado = "Activo";
            Decimal dSaldo = Convert.ToDecimal(txtSaldo.Text.Trim());
            cobranza.SaldoCliente = dSaldo;
            cobranza.Monto = ingreso.Monto;
            cobranza.Pago = venta.Pago;
            cobranza.CtaCte = venta.CtaCte;
            cobranza.Total = venta.Total;
            cobranza.Obs = txtObservaciones.Text;
            cobranza.Id_Usuario = ingreso.Id_Usuario;

            bmCobranzas.BMCobranzasInsert(cobranza);

            // Actualizar Cheques
            listaChequesCambio = (List<Cheques>)Session["listaChequesCambio"];
            if (listaChequesCambio.Count > 0)
            {
                BMCheques bmCheques = new BMCheques(Connection);
                foreach (Cheques cheque in listaChequesCambio)
                {
                    cheque.Id_Ventas = venta.Id_Ventas;
                    bmCheques.BMChequesUpdateEstado(cheque);
                }
            }

            Session["Venta"] = null;

        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region LimpiarCheque
    protected void LimpiarCheque()
    {
        try
        {
            txtCodBanco.Text = "";
            txtBanco.Text = "";
            txtNumero.Text = "";
            txtMontoCheque.Text = "0";
            FechaCh.SetFecha(null);
            txtItem.Text = "";
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #endregion
   
}
